package com.monkey.springbootvue.controller;

import com.monkey.springbootvue.entity.Book;
import com.monkey.springbootvue.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.*;

import java.util.List;

// 表明这个类是一个Spring RESTful风格的控制器，用于处理HTTP请求并返回响应数据，通常返回的数据会被转换为JSON等格式发送给客户端（如前端应用）
@RestController
// 为这个控制器类中的所有请求处理方法配置统一的请求路径前缀，这里表示该控制器下的接口路径都以"/book"开头
@RequestMapping("/book")
// 这里原本有个@CrossOrigin注解被注释掉了，它通常用于解决跨域问题，如果启用的话可以配置允许哪些来源的跨域请求等信息
// @CrossOrigin
public class BookHandler {

    // 使用@Autowired注解进行依赖注入，Spring会自动查找并注入类型为BookRepository的实例，通过它可以操作数据库中与Book相关的数据
    @Autowired
    private BookRepository bookRepository;

    // 处理HTTP GET请求，路径为"/book/findAll/{page}/{size}"，用于分页查询所有的Book数据
    // @PathVariable注解用于获取路径中的参数值，这里分别获取表示页码的page参数和表示每页数量的size参数
    @GetMapping("/findAll/{page}/{size}")
    public Page<Book> findAll(@PathVariable("page") Integer page, @PathVariable("size") Integer size) {
        // 根据传入的页码和每页数量创建一个PageRequest对象，用于传递给数据访问层进行分页查询操作
        PageRequest request = PageRequest.of(page, size);
        // 调用bookRepository的findAll方法，传入PageRequest对象，获取并返回分页后的Book数据列表，返回类型是Page<Book>，包含了分页相关的信息以及查询到的Book数据
        return bookRepository.findAll(request);
    }

    // 处理HTTP POST请求，路径为"/book/save"，用于保存一本新书的信息到数据库中
    // @RequestBody注解表示将请求体中的JSON等格式的数据转换为Book对象，这个对象包含了要保存的书籍信息
    @PostMapping("/save")
    public String save(@RequestBody Book book) {
        // 调用bookRepository的save方法，将传入的Book对象保存到数据库中，保存成功后返回保存后的Book对象（包含了可能更新后的一些数据库生成的字段值等）
        Book result = bookRepository.save(book);
        // 如果保存后返回的结果不为null，说明保存成功，返回"success"字符串给客户端作为响应
        if (result!= null) {
            return "success";
        } else {
            // 如果返回结果为null，说明保存出现问题，返回"error"字符串给客户端作为响应
            return "error";
        }
    }

    // 处理HTTP GET请求，路径为"/book/findById/{id}"，用于根据书籍的唯一标识符（id）查询某一本具体的书
    // @PathVariable注解用于获取路径中的id参数值，这个值对应要查询的书籍的唯一标识
    @GetMapping("/findById/{id}")
    public Book findById(@PathVariable("id") Integer id) {
        // 调用bookRepository的findById方法，传入书籍的id，该方法返回一个Optional<Book>类型，使用get方法获取其中的Book对象并返回，如果找不到对应的书籍会抛出NoSuchElementException异常
        return bookRepository.findById(id).get();
    }

    // 处理HTTP PUT请求，路径为"/book/updateshu"，用于更新书籍的信息，功能和save方法类似，不过一般PUT常用于更新已存在的资源
    @PutMapping("/updateshu")
    public String updateshu(@RequestBody Book book) {
        // 调用bookRepository的save方法，传入要更新的Book对象，这里save方法既可以用于保存新书，也可以用于更新已存在的书籍（根据对象的id等标识来判断）
        Book result = bookRepository.save(book);
        if (result!= null) {
            return "success";
        } else {
            return "error";
        }
    }

    // 处理HTTP DELETE请求，路径为"/book/deleteById/{id}"，用于根据书籍的唯一标识符（id）删除某一本具体的书
    // @PathVariable注解用于获取路径中的id参数值，这个值对应要删除的书籍的唯一标识
    @DeleteMapping("/deleteById/{id}")
    void deleteshu(@PathVariable("id") Integer id) {
        // 调用bookRepository的deleteById方法，传入书籍的id，执行删除操作，该方法没有返回值，直接在数据库中删除对应id的书籍记录
        bookRepository.deleteById(id);
    }

}